package utils.sl651;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * SL651协议报文生成工具类
 * 报文正文的数据有问题-数据部分-解析不到数据-格式问题-不想改了
 *
 * 
 * 注意：此类已重构，大部分通用方法已移至SL651CommonUtil类
 */
public class SL651GenMsgUtil {

    /**
     * 生成批量测试HEX编码报文
     *
     * @param count 生成数量
     * @return 报文数组
     */
    public static String[] generateHexBatchTestMessages(int count) {
        String[] messages = new String[count];

        for (int i = 0; i < count; i++) {
            // 循环生成不同类型的HEX报文
            switch (i % 5) {
                case 0:
                    messages[i] = generateHexLinkMaintenanceMessage();
                    break;
                case 1:
                    messages[i] = generateHexTestMessage();
                    break;
                case 2:
                    messages[i] = generateHexTimerMessage();
                    break;
                case 3:
                    messages[i] = generateHexAddMessage();
                    break;
                case 4:
                    messages[i] = generateHexHourMessage();
                    break;
            }
        }

        return messages;
    }

    /**
     * 根据功能码生成对应的HEX编码报文
     *
     * @param functionCode 功能码（如"2F", "30", "32"等）
     * @return 生成的HEX编码报文字符串，如果不支持则返回null
     */
    public static String generateHexMessageByFunctionCode(String functionCode) {
        switch (functionCode.toUpperCase()) {
            case "2F":
                return generateHexLinkMaintenanceMessage();
            case "30":
                return generateHexTestMessage();
            case "32":
                return generateHexTimerMessage();
            case "33":
                return generateHexAddMessage();
            case "34":
                return generateHexHourMessage();
            case "35":
                return generateHexManualDataMessage();
            default:
                return null;
        }
    }

    /**
     * 生成链路维持报文（功能码2F）- HEX编码格式
     */
    public static String generateHexLinkMaintenanceMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("2F");                // 功能码（1字节HEX）- 链路维持报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append("250829120000");      // 发报时间（6字节BCD码）

        // 链路维持报文通常无数据内容

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成测试报文（功能码30）- HEX编码格式
     */
    public static String generateHexTestMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("30");                // 功能码（1字节HEX）- 测试报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）

        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式数据
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("2619000005");  // 降水量累计值为 0.5mm
        message.append("392300000127");  // 瞬时河道水位为 0.127m
        message.append("38121115");  // 11.15V

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成定时报文（功能码32）- HEX编码格式
     */
    public static String generateHexTimerMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("32");                // 功能码（1字节HEX）- 定时报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式数据
        message.append("2019000040");  // 当前降水量
        message.append("2619000040");  // 降水量累计值 4.0mm
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("201900000A");  // " PJ 15.5"
        // message.append("602300001F4");  // " 水温

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成加报报文（功能码33）- HEX编码格式
     */
    public static String generateHexAddMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("1122334455");        // 遥测站地址（5字节HEX/BCD）
        message.append("8765");              // 密码（2字节HEX）
        message.append("33");                // 功能码（1字节HEX）- 加报报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式数据
        message.append("5354203131323233");  // "ST 11223"
        message.append("20545420");          // " TT "
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("20504A2038302E35");  // " PJ 80.5" 
        message.append("205A2031352E38");  // " Z 15.58"
        message.append("2056542031312E32");  // " VT 11.2"
        message.append("20542032352E38");    // " T 25.8"
        message.append("2054572032302E35");  // " TW 20.5"

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成小时报文（功能码34）- HEX编码格式
     */
    public static String generateHexHourMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("34");                // 功能码（1字节HEX）- 小时报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式数据
        message.append("5354203132333435");  // "ST 12345"
        message.append("20545420");          // " TT "
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("20504A2032352E30");  // " PJ 25.0" 
        message.append("205A2031322E3538");  // " Z 12.58"
        message.append("2056542031322E33");  // " VT 12.3"
        message.append("2044525020");        // " DRP "
        message.append("00000A0F0F0F0F0F0F0F0F0F0F00"); // 小时序列数据

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成人工置数报文（功能码35）- HEX编码格式
     */
    public static String generateHexManualDataMessage() {
        StringBuilder message = new StringBuilder();

        // 按照SL651协议表20的HEX/BCD编码规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("5566778899");        // 遥测站地址（5字节HEX/BCD）
        message.append("1122");              // 密码（2字节HEX）
        message.append("35");                // 功能码（1字节HEX）- 人工置数报文
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式数据
        message.append("5354203535363637");  // "ST 55667"
        message.append("20545420");          // " TT "
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("20504A2031382E35");  // " PJ 18.5" 
        message.append("205A2031312E3235");  // " Z 11.25"
        message.append("2056542031322E38");  // " VT 12.8"
        message.append("20542032332E35");    // " T 23.5"

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成HEX编码格式的SL651报文（以7E7E开头）
     */
    public static String generateHexFormatSL651Message() {
        StringBuilder message = new StringBuilder();

        // HEX编码格式的SL651报文结构 - 按照表20规范
        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("30");                // 功能码（1字节HEX）
        message.append("1020");              // 报文上行标识及长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）

        // 报文正文（包括流水号、发报时间和数据）
        message.append("0001");              // 流水号（2字节HEX）
        message.append(SL651CommonUtil.getSL651TimeHex());   // 发报时间（6字节BCD格式）

        // 数据部分 - HEX格式数据应直接包含十六进制值
        message.append("5354203132333435");  // "ST 12345"
        message.append("20545420");          // " TT "
        message.append("F0F0" + SL651CommonUtil.getSL651TimeHex());   // 时间
        message.append("20504A2031352E35");  // " PJ 15.5"
        message.append("205A2031302E3538");  // " Z 10.58"
        message.append("2056542031322E30");  // " VT 12.0"

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 提供HEX编码的SL651示例报文
     */
    public static String getHexSL651ExampleMessage() {
        // HEX编码格式的SL651协议报文（以7E7E开头）
        // 按照SL651协议表20的HEX/BCD编码规范
        StringBuilder message = new StringBuilder();

        message.append("7E7E");              // 起始符（2字节HEX）
        message.append("01");                // 中心站地址（1字节HEX）
        message.append("0123456789");        // 遥测站地址（5字节HEX/BCD）
        message.append("1234");              // 密码（2字节HEX）
        message.append("32");                // 功能码（1字节HEX）- 定时报
        message.append("1020");              // 上行标识和长度（2字节）
        message.append("02");                // 报文起始符STX（1字节）
        message.append("0001");              // 流水号（2字节HEX）
        message.append("250829120000");      // 发报时间（6字节BCD码）

        // 数据部分 - HEX格式
        message.append("5354203132333435");  // "ST 12345"
        message.append("20482054542032353038323931323032303020");  // " H TT 250829120200 "
        message.append("504A2031352E35");    // "PJ 15.5"
        message.append("205A2031302E3538");  // " Z 10.58"
        message.append("2056542031322E30");  // " VT 12.0"
        message.append("2054572031382E35");  // " TW 18.5"

        message.append("03");                // 报文结束符ETX（1字节）

        // 计算CRC校验码（2字节HEX）
        String crc = SL651CommonUtil.calculateCrc16(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成批量测试ASCII编码报文
     *
     * @param count 生成数量
     * @return 报文数组
     */
    public static String[] generateAsciiBatchTestMessages(int count) {
        String[] messages = new String[count];

        for (int i = 0; i < count; i++) {
            // 循环生成不同类型的ASCII报文
            switch (i % 5) {
                case 0:
                    messages[i] = generateAsciiLinkMaintenanceMessage();
                    break;
                case 1:
                    messages[i] = generateAsciiTestMessage();
                    break;
                case 2:
                    messages[i] = generateAsciiTimerMessage();
                    break;
                case 3:
                    messages[i] = generateAsciiAddMessage();
                    break;
                case 4:
                    messages[i] = generateAsciiHourMessage();
                    break;
            }
        }

        return messages;
    }

    /**
     * 根据功能码生成对应的ASCII编码报文
     *
     * @param functionCode 功能码（如"2F", "30", "32"等）
     * @return 生成的ASCII编码报文字符串，如果不支持则返回null
     */
    public static String generateAsciiMessageByFunctionCode(String functionCode) {
        switch (functionCode.toUpperCase()) {
            case "2F":
                return generateAsciiLinkMaintenanceMessage();
            case "30":
                return generateAsciiTestMessage();
            case "32":
                return generateAsciiTimerMessage();
            case "33":
                return generateAsciiAddMessage();
            case "34":
                return generateAsciiHourMessage();
            case "35":
                return generateAsciiManualDataMessage();
            default:
                return null;
        }
    }

    /**
     * 生成链路维持报文（功能码2F）- ASCII编码格式
     */
    public static String generateAsciiLinkMaintenanceMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("0123456789");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1234");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("2F");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0001");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);

        // 链路维持报文通常无数据内容，或仅包含基本站点信息
        message.append("ST 12345 H");        // 站点标识和分类码

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成测试报文（功能码30）- ASCII编码格式
     */
    public static String generateAsciiTestMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("0123456789");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1234");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("30");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0002");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);

        timeString = SL651CommonUtil.getSL651Time2();
        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = " ST 12345 TT " + timeString + " PJ 0.5 Z 10.58 VT 12.5 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成定时报文（功能码32）- ASCII编码格式
     */
    public static String generateAsciiTimerMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("0123456789");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1234");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("32");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0003");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);
        timeString = SL651CommonUtil.getSL651Time2();
        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = "ST 12345 TT " + timeString + " PJ 15.5 Z 10.58 VT 12.0 T 22.5 TW 18.5 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成加报报文（功能码33）- ASCII编码格式
     */
    public static String generateAsciiAddMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("1122334455");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("8765");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("33");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0004");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);
        timeString = SL651CommonUtil.getSL651Time2();
        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = "ST 11223 TT " + timeString + " PJ 80.5 Z 15.58 VT 11.2 T 25.8 TW 20.5 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成小时报文（功能码34）- ASCII编码格式
     */
    public static String generateAsciiHourMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("0123456789");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1234");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("34");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0005");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);
        timeString = SL651CommonUtil.getSL651Time2();
        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = "ST 12345 TT " + timeString + " PJ 25.0 Z 12.58 VT 12.3 DRP 00000A0F0F0F0F0F0F0F0F0F0F00 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成人工置数报文（功能码35）- ASCII编码格式
     */
    public static String generateAsciiManualDataMessage() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("5566778899");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1122");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("35");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0007");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);
        timeString = SL651CommonUtil.getSL651Time2();
        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = "ST 55667 TT " + timeString + " PJ 18.5 Z 11.25 VT 12.8 T 23.5 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }

    /**
     * 生成标准ASCII编码格式的SL651报文（以01开头）
     */
    public static String generateAsciiFormatSL651Message() {
        StringBuilder message = new StringBuilder();

        // ASCII编码格式的SL651报文结构
        message.append("01");                // 起始符SOH（1字节，2个ASCII字符）
        message.append("01");                // 中心站地址（1字节HEX编码，2个ASCII字符）
        message.append("0123456789");        // 遥测站地址（5字节HEX编码，10个ASCII字符）
        message.append("1234");              // 密码（2字节HEX编码，4个ASCII字符）
        message.append("30");                // 功能码（1字节HEX编码，2个ASCII字符）
        message.append("1002");              // 报文上行标识及长度（2字节HEX编码，4个ASCII字符）
        message.append("02");                // 数据起始符STX（1字节，2个ASCII字符）
        message.append("0003");              // 流水号（2字节HEX编码，4个ASCII字符）

        // 发报时间（12字节ASCII - YYMMDDHHmmSS）
        String timeString = SL651CommonUtil.getSL651Time();  // 获取当前时间，格式为yyMMddHHmmss
        message.append(timeString);

        // 数据部分 - ASCII格式（按照SL651协议要求：要素标识符 空格 数据 空格）
        // 报文正文最后的1个空格不得省略
        String data = "ST 12345 TT " + timeString + " PJ 15.5 Z 10.58 VT 12.0 ";
        message.append(data);

        message.append("03");                // 数据结束符ETX（1字节，2个ASCII字符）

        // 计算CRC（2字节HEX编码，4个ASCII字符）
        String crc = SL651CommonUtil.calculateCrc16ForAscii(message.toString());
        message.append(crc);

        return message.toString();
    }
    
}